/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.fh.itsbankomat.businesslogic.impl;

import java.math.BigDecimal;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.fh.itsbankomat.businesslogic.api.KreditInstitutService;
import org.fh.itsbankomat.businesslogic.model.Konto;
import org.fh.itsbankomat.businesslogic.model.Transaktionen;

/**
 *
 * @author MeinLaptop
 */
@Stateless
@LocalBean
public class KreditInstitutServiceImpl implements KreditInstitutService {
    @PersistenceContext
    private EntityManager em;

    @Override
    public Transaktionen pruefenKonto(Transaktionen v_Transaktion) {
        
        // Kontonummer befüllt? (korrekte Übergabe)
        if(v_Transaktion.getIban() == null)
        {
            v_Transaktion.setMessageid("IBAN not filled");
            v_Transaktion.setMessage("pruefen Konto: IBAN not filled");
            return v_Transaktion;
        }
        
        if(v_Transaktion.getMessageid().equals("") )
        {        
            Konto konto = em.createNamedQuery("Konto.findByIban", Konto.class)
                .setParameter(" ", v_Transaktion.getIban()).getSingleResult();
            if(konto == null)
            {
                v_Transaktion.setMessageid("KontoDoesNotExist");
                v_Transaktion.setMessage("pruefen Konto: Das Konto mit dem IBAN  " + v_Transaktion.getIban() + " existiert nicht.");
            }
            
            BigDecimal betrag = v_Transaktion.getBetrag();
            BigDecimal saldo = konto.getSaldo();
            BigDecimal ueberziehungsRahmen = konto.getUeberziehungsrahmen();
            BigDecimal saldoPlusRahmen = saldo.add(ueberziehungsRahmen);
            // prüfen ob Konto gedeckt
            if(saldoPlusRahmen.compareTo(betrag) >= 0 )
            {
                BigDecimal newSaldo = saldo.subtract(betrag);
                konto.setSaldo(newSaldo);
                v_Transaktion.setMessageid("");
                v_Transaktion.setMessage("pruefen Konto: Betrag " + betrag + " wurde von Konto mit dem IBAN  " + v_Transaktion.getIban() + " erfolgreich abgebucht.");
                return v_Transaktion;
            }
            else
            {
                v_Transaktion.setMessageid("KontoNichtGedeckt");
                v_Transaktion.setMessage("pruefen Konto: Der Betrag " + betrag + " kann nicht von Konto " + v_Transaktion.getIban() + " abgebucht werden.");
                return v_Transaktion;
            }
        }
        else
        {
            return v_Transaktion;
        }
    }

    @Override
    public Transaktionen abbuchenBetrag(Transaktionen v_Transaktion) {
        
        // Kontonummer befüllt? (korrekte Übergabe)
        if(v_Transaktion.getIban() == null)
        {
            v_Transaktion.setMessageid("IBANleer");
            v_Transaktion.setMessage("abbuchenBetrag: IBAN ist nicht befüllt");
            return v_Transaktion;
        }
        
        // prüfe Betrag
        if(v_Transaktion.getBetrag() == null)
        {
            v_Transaktion.setMessageid("BetragLeer");
            v_Transaktion.setMessage("abbuchenBetrag: Betrag ist nicht befüllt");
            return v_Transaktion;
        }
        
        if(v_Transaktion.getMessageid().equals("") )
        {        
            Konto konto = em.createNamedQuery("Konto.findByIban", Konto.class)
                .setParameter(" ", v_Transaktion.getIban()).getSingleResult();
            if(konto == null)
            {
                v_Transaktion.setMessageid("KontoDoesNotExist");
                v_Transaktion.setMessage("abbuchenBetrag: Das Konto mit dem IBAN  " + v_Transaktion.getIban() + " existiert nicht.");
            }
            
            BigDecimal betrag = v_Transaktion.getBetrag();
            BigDecimal saldo = konto.getSaldo();
            BigDecimal ueberziehungsRahmen = konto.getUeberziehungsrahmen();
            BigDecimal saldoPlusRahmen = saldo.add(ueberziehungsRahmen);
            // prüfen ob Konto gedeckt
            if(saldoPlusRahmen.compareTo(betrag) >= 0 )
            {
                BigDecimal newSaldo = saldo.subtract(betrag);
                konto.setSaldo(newSaldo);
                v_Transaktion.setMessageid("");
                v_Transaktion.setMessage("abbuchenBetrag: Betrag " + betrag + " wurde von Konto mit dem IBAN  " + v_Transaktion.getIban() + " erfolgreich abgebucht.");
                return v_Transaktion;
            }
            else
            {
                v_Transaktion.setMessageid("KontoNichtGedeckt");
                v_Transaktion.setMessage("abbuchenBetrag: Der Betrag " + betrag + " kann nicht von Konto " + v_Transaktion.getIban() + " abgebucht werden.");
                return v_Transaktion;
            }
        }
        else
        {
            return v_Transaktion;
        }
    }

    @Override
    public Transaktionen einzahlen(Transaktionen v_Transaktion) {
        
        // Kontonummer befüllt? (korrekte Übergabe)
        if(v_Transaktion.getIban() == null)
        {
            v_Transaktion.setMessageid("IBANleer");
            v_Transaktion.setMessage("einzahlen: IBAN ist nicht befüllt");
            return v_Transaktion;
        }
        
        // prüfe Betrag
        if(v_Transaktion.getBetrag() == null)
        {
            v_Transaktion.setMessageid("BetragLeer");
            v_Transaktion.setMessage("einzahlen: Betrag ist nicht befüllt");
            return v_Transaktion;
        }
        
        if(v_Transaktion.getMessageid().equals("") )
        {        
            Konto konto = em.createNamedQuery("Konto.findByIban", Konto.class)
                .setParameter(" ", v_Transaktion.getIban()).getSingleResult();
            if(konto == null)
            {
                v_Transaktion.setMessageid("KontoDoesNotExist");
                v_Transaktion.setMessage("einzahlen: Das Konto mit dem IBAN  " + v_Transaktion.getIban() + " existiert nicht.");
            }
            
            // Betrag einbuchen
            BigDecimal newSaldo = konto.getSaldo().add(v_Transaktion.getBetrag());
            konto.setSaldo(newSaldo);
            v_Transaktion.setMessageid("");
            v_Transaktion.setMessage("einzahlen: Betrag " + v_Transaktion.getBetrag() + " wurde auf das Konto mit dem IBAN  " + v_Transaktion.getIban() + " eingezahlt.");
        }
        else
        {
            return v_Transaktion;
        }
        
        return v_Transaktion;
    }
    
}
